from flask import Flask, request, jsonify
from langchain import PromptTemplate, LLMChain
from langchain.llms import OpenAI
import json
from flask_cors import CORS  # 导入 CORS
import requests
import os
app = Flask(__name__)
CORS(app)  # 启用 CORS，允许所有来源访问

# 初始化 LangChain
# 设置 OpenAI API 密钥
import os
os.environ["OPENAI_API_KEY"] = "sk-fhfopxxokpblqjbivoyhwhftlbjwrgeddccbytodqipkaqum"
base_url="https://api.siliconflow.cn/v1"
# 配置 SiliconFlow 的 OpenAI 兼容 API
llm = OpenAI(
    openai_api_base=base_url,
    api_key=os.environ.get("OPENAI_API_KEY"),
    # 不是推理模型
    #model_name="Qwen/Qwen3-235B-A22B",
    model_name="deepseek-ai/deepseek-V3",
    temperature=0.1,
    top_p=0.1,
    max_tokens=50
)

import requests

url = "https://api.siliconflow.cn/v1/chat/completions"
headers = {
    "Authorization": "Bearer sk-fhfopxxokpblqjbivoyhwhftlbjwrgeddccbytodqipkaqum",
    "Content-Type": "application/json"
}

def get_elements(elements):
        payload = {
            "model": "Qwen/QwQ-32B",
            "messages": [
                {
                    "role": "user",
                    "content": """玩一个类似「涂鸦上帝」的元素合成游戏。
            用户输入：{elements}
            规则：
            1. 游戏开始时，用户输入{elements}
            2. 游戏会根据用户输入的{elements}随机生成新的物质
            3. 你只需要返回新的物质的名称，以及新物质的emoji"""
                }
            ],
            "stream": False,
            "max_tokens": 50,
            "enable_thinking": False,
            "thinking_budget": 10,
            "min_p": 0.05,
            "stop": None,
            "temperature": 0.2,
            "top_p": 0.2,
            "top_k": 2,
            "frequency_penalty": 0.5,
            "n": 1,
            "response_format": {"type": "text"},
            "tools": [
                {
                    "type": "function",
                    "function": {
                        "description": "<string>",
                        "name": "<string>",
                        "parameters": {},
                        "strict": False
                    }
                }
            ]
        }
        return payload






prompt = PromptTemplate(
    input_variables=["elements"],
    template="""

    通过对话的方式玩一个类似「涂鸦上帝」的元素合成游戏。
    用户输入：{elements}
    请严格遵守规则：
    游戏会根据用户输入的{elements}随机生成新的物质
    你只需要返回新的物质的名称，以及新物质的emoji ,不需要解释，不需要新合成的物质说明
    """
)

llm_chain = LLMChain(llm=llm, prompt=prompt)

def synthesize_elements(elements_str):
    print(elements_str)
    if not elements_str:
        return jsonify({"error": "请提供元素数组"}), 400
    
    elements = elements_str
    if len(elements) != 2:
        return jsonify({"error": "请提供两个元素进行合成"}), 400
    
    elements_input = elements_str[0] +"+"+elements_str[1]
    print("elements", elements_input)
    # 修改此处，使用 llm_chain 来生成结果
    #result = llm_chain.run(elements=elements_input)
    #print("组装后的 prompt:", llm_chain.prompt.format(elements=elements_input))
    
    response = requests.request("POST", url, json=get_elements(elements_input), headers=headers)

    response.raise_for_status()  # 检查请求是否成功
    result = response.json()  # 解析
    print (result)
    print("result： ","--------------------------------------------------")
    print("result： ",result.content)
    print("result： ","--------------------------------------------------")
    prompt2 = PromptTemplate(
        input_variables=["param_content", "elements"],
        template="""问题： {elements} 可以合成什么？
        根据以下内容选出最合适的一个回答：
        内容：{param_content}
        字数不超过10个字，不要输出其他文字、解释或多余内容。
        """
    )
    llm_chain2 = LLMChain(llm=llm, prompt=prompt2)
    print("组装后的 prompt2:", prompt2.format(elements=elements_input, param_content=result))

    # 同时提供 elements 和 param_content
    result = llm_chain2.run(elements=elements_input, param_content=result)
    print("--------------------")
    print("result： ",result)
    # 只取第一个合成结果
    first_result = result
    if "不知道" in first_result:
        new_element = None
    else:
        new_element = first_result
    print(new_element)
    return jsonify({"data": new_element})

if __name__ == '__main__':
    synthesize_elements(["木","火"])